package controller

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"k8s-platform/service"
	"log"
	"net/http"
)

var PersistentVolume persistentvolume
type persistentvolume struct {}

type node struct {}
var Node node

type namespace struct {}
var Namespace namespace

//获取 node 列表
func (n *node)GetNodes(c *gin.Context)  {
	data, err := service.Node.GetNodeInfo()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get node list success",
		"data": data,
	})
}


//获取 node 详情
func (n *node) GetNodeDetail(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		NodeName string `form:"node_name" binding:"required"`
	})
	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.Bind(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	data, err := service.Node.GetNodeDetail(params.NodeName)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get node detail success",
		"data": data,
	})
}


//获取 namespace 列表
func (n *namespace)GetNamespace(c *gin.Context)  {
	data, err := service.Namespace.GetNamespace()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get namespace list success",
		"data": data,
	})
}


//获取 namespace 详情
func (n *namespace) GetNSDetail(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		NameSpace string `form:"name_space" binding:"required"`
	})

	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.Bind(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	data, err := service.Namespace.GetNSDetail(params.NameSpace)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get node detail success",
		"data": data,
	})
}

//create namespace
func (n *namespace) CreateNamespace(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		Name string `json:"name" binding:"required"`
	})

	//form使用Bind方法  json使用 ShouldBindJSON
	if err := c.ShouldBindJSON(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	err := service.Namespace.CreateNamespace(params.Name)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "create namespace success",
		"data": nil,
	})
}


//delete namespace
func (n *namespace) DeleteNamespace(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		Name string `json:"name" binding:"required"`
	})

	//form使用Bind方法  json使用 ShouldBindJSON
	if err := c.ShouldBindJSON(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	err := service.Namespace.DelNamespace(params.Name)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "delete namespace success",
		"data": nil,
	})
}



//获取 persistentvolume 列表
func (p *persistentvolume)Getpersistentvolume(c *gin.Context)  {
	data, err := service.PersistentVolume.GetPVList()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get PersistentVolume list success",
		"data": data,
	})
}


//获取 persistentvolume 详情
func (p *persistentvolume) GetNSDetail(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		PVName string `form:"pv_name" binding:"required"`
	})

	//form使用Bind方法  json使用ShouldBindJSON
	if err := c.Bind(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	data, err := service.PersistentVolume.GetPVDetail(params.PVName)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "get PersistentVolume detail success",
		"data": data,
	})
}

//delete persistentvolume
func (p *persistentvolume) DeletePV(c *gin.Context) {
	//处理入参 匿名结构体 用于定义入参 get请求为form格式 其他请求为json
	params := new(struct {
		Name string `json:"name" binding:"required"`
	})

	//form使用Bind方法  json使用 ShouldBindJSON
	if err := c.ShouldBindJSON(params); err != nil {
		log.Printf("Bind绑定参数失败：%s", err)
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  fmt.Sprintf("Bind绑定参数失败：%s", err),
			"data": nil,
		})
		return
	}

	err := service.PersistentVolume.DeletePV(params.Name)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"msg":  "delete PersistentVolume success",
		"data": nil,
	})
}
